package com.shenma2009.logs;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.AppenderBase;
import cn.hutool.core.date.DateUtil;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

/**
 * @author 军哥
 * @version 1.0
 * @description: ShenmaLogAppender2
 * @date 2023/6/1 15:17
 */

@Getter
@Setter
public class ShenmaLogAppender2 extends AppenderBase<LoggingEvent> {
    PatternLayoutEncoder encoder;


    @Override
    public void start() {
        if (this.encoder == null) {
            //name ： logback-spring.xml 中 appender 标签 配置的name值
            addError("No encoder set for the appender named [" + name + "].");
            return;
        }

        // 连接数据库

        super.start();
    }

    @Override
    public void stop() {
        //释放相关资源，如数据库连接，redis线程池等等
        System.out.println("stop方法被调用");
        if (!isStarted()) {
            return;
        }
        super.stop();
    }

    @Override
    protected void append(LoggingEvent eventObject) {
        Level level = eventObject.getLevel();

        // 日志时间
        Date date = new Date(eventObject.getTimeStamp());
        String format = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println("=> " + format);

        // 线程名
        System.out.println("=> "+eventObject.getThreadName());

        // 日志级别
        System.out.println("=> "+eventObject.getLevel().levelStr);

        // 日志名字
        System.out.println("=> "+eventObject.getLoggerName());

        // 日志消息
        System.out.println("=> "+eventObject.getFormattedMessage());

        StackTraceElement[] callerData = eventObject.getCallerData();

        for (StackTraceElement element : callerData) {
            System.out.println(element.getClassName());
            System.out.println(element.getMethodName());
            System.out.println(element.getFileName());
            System.out.println(element.getLineNumber());
        }

        // 把日志信息存入数据库

        /**
         * 指定只有 error 级别的日志，才发记录消息
         * 后续可以根据配置指定，此处暂不实现
         */
        if (Level.ERROR.levelInt == level.levelInt) {

        }
    }
}
